import configparser
from pathlib import Path
from typing import Dict, Optional, Any
import logging


class ConfigHelper:
    """
    配置文件帮助类
    功能：
    - 加载和解析配置文件
    - 支持多section配置
    - 提供类型转换方法
    - 完善的错误处理
    """

    def __init__(self, config_file: str = 'config.ini'):
        """
        初始化配置帮助类

        :param config_file: 配置文件路径，默认为当前目录下的config.ini
        """
        self.config_file = config_file
        self.logger = logging.getLogger('ConfigHelper')
        logging.basicConfig(level=logging.INFO)
        self._config = configparser.ConfigParser()

        # 初始化时自动加载配置
        self._load_config_file()

    def _load_config_file(self):
        """加载配置文件"""
        try:
            if not Path(self.config_file).exists():
                raise FileNotFoundError(f"配置文件 {self.config_file} 不存在")

            self._config.read(self.config_file, encoding='utf-8')
            self.logger.info(f"成功加载配置文件: {self.config_file}")
        except Exception as e:
            self.logger.error(f"加载配置文件失败: {e}")
            raise

    def get_section_config(self, section: str) -> Dict[str, str]:
        """
        获取指定section的所有配置项

        :param section: 配置节名称
        :return: 配置字典
        :raises: ValueError 当section不存在时
        """
        if not self._config.has_section(section):
            raise ValueError(f"配置文件中缺少 [{section}] 节")

        return dict(self._config[section])

    def get_value(self, section: str, key: str, default: Any = None) -> Optional[str]:
        """
        获取指定配置项的值

        :param section: 配置节名称
        :param key: 配置键名
        :param default: 默认值(当配置项不存在时返回)
        :return: 配置值或默认值
        """
        try:
            return self._config.get(section, key)
        except (configparser.NoSectionError, configparser.NoOptionError):
            self.logger.warning(f"配置项 [{section}] {key} 不存在，返回默认值: {default}")
            return default

    def get_int(self, section: str, key: str, default: int = 0) -> int:
        """
        获取整数类型的配置值

        :param section: 配置节名称
        :param key: 配置键名
        :param default: 默认值
        :return: 整数配置值
        """
        value = self.get_value(section, key)
        if value is None:
            return default
        try:
            return int(value)
        except ValueError:
            self.logger.warning(f"配置项 [{section}] {key} 不是有效的整数，返回默认值: {default}")
            return default

    def get_float(self, section: str, key: str, default: float = 0.0) -> float:
        """
        获取浮点数类型的配置值

        :param section: 配置节名称
        :param key: 配置键名
        :param default: 默认值
        :return: 浮点数配置值
        """
        value = self.get_value(section, key)
        if value is None:
            return default
        try:
            return float(value)
        except ValueError:
            self.logger.warning(f"配置项 [{section}] {key} 不是有效的浮点数，返回默认值: {default}")
            return default

    def get_boolean(self, section: str, key: str, default: bool = False) -> bool:
        """
        获取布尔类型的配置值

        :param section: 配置节名称
        :param key: 配置键名
        :param default: 默认值
        :return: 布尔配置值
        """
        value = self.get_value(section, key)
        if value is None:
            return default
        try:
            return self._config.getboolean(section, key)
        except ValueError:
            self.logger.warning(f"配置项 [{section}] {key} 不是有效的布尔值，返回默认值: {default}")
            return default

    def reload(self):
        """重新加载配置文件"""
        self._load_config_file()
        self.logger.info("配置文件已重新加载")


# 使用示例
if __name__ == '__main__':
    # 示例配置文件内容 (config.ini):
    """
    [database]
    host = localhost
    port = 3306
    username = root
    password = 123456
    use_ssl = true

    [app]
    debug = true
    max_workers = 4
    timeout = 30.5
    """

    try:
        # 初始化配置帮助类
        config = ConfigHelper('config.ini')

        # 获取整个section的配置
        db_config = config.get_section_config('database')
        print("数据库配置:", db_config)

        # 获取单个配置值
        db_host = config.get_value('database', 'host')
        print("数据库主机:", db_host)

        # 获取整数配置
        max_workers = config.get_int('app', 'max_workers', default=2)
        print("最大工作线程数:", max_workers)

        # 获取浮点数配置
        timeout = config.get_float('app', 'timeout', default=10.0)
        print("超时时间:", timeout)

        # 获取布尔值配置
        debug_mode = config.get_boolean('app', 'debug', default=False)
        print("调试模式:", debug_mode)

    except Exception as e:
        print(f"配置加载失败: {e}")